home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 1 (Walnut Creek)
/
Aminet - June 1993 [Walnut Creek].iso
/
usenet
/
sources
/
volume89
/
kernel
/
xoper20.2
< prev
next >
Wrap
Internet Message Format
|
1989-10-28
|
65KB
Path: xanth!ames!sun-barr!newstop!sun!swap!root
From: root%swap@Sun.COM (Operator)
Newsgroups: comp.sources.amiga
Subject: v89i191: xoper - examine & control your kernel, Part02/03
Message-ID: <127006@sun.Eng.Sun.COM>
Date: 28 Oct 89 07:15:51 GMT
Sender: news@sun.Eng.Sun.COM
Lines: 2821
Approved: page@sun.com
Submitted-by: g35@dhdurz1@bitnet (Werner Guenther)
Posting-number: Volume 89, Issue 191
Archive-name: kernel/xoper20.2
# This is a shell archive.
# Remove anything above and including the cut line.
# Then run the rest of the file through 'sh'.
# Unpacked files will be owned by you and have default permissions.
#----cut here-----cut here-----cut here-----cut here----#
#!/bin/sh
# shar: SHell ARchive
# Run the following text through 'sh' to create:
# xoper.a2
# This is archive 2 of a 3-part kit.
# This archive created: Fri Oct 27 23:48:52 1989
echo "extracting xoper.a2"
sed 's/^X//' << \SHAR_EOF > xoper.a2
X3$ bra restart
X
X;fill all unused memory-chunks with a longword
Xclear moveq #0,d0
X cmp.b #10,0(a0)
X beq.s clr5
X bsr readhex
X tst.b d7
X beq syntax
Xclr5 move.l _SysBase(PC),a0
X clr.l parmtxt
X lea 322(a0),a0
X move.w #$4000,$dff09a
Xclr1 move.l 0(a0),a0
X tst.l 0(a0)
X beq.s clr4
X move.l 16(a0),a1
Xclr2 tst.l 0(a1)
X beq.s clr1
X addq.l #1,parmtxt
X move.l 4(a1),d1
X subq.l #8,d1
X beq.s clr31
X lsr.l #2,d1
X subq.l #1,d1
X lea 8(a1),a2
Xclr3 move.l d0,(a2)+
X dbf d1,clr3
Xclr31 move.l 0(a1),a1
X bra.s clr2
Xclr4 move.w #-$4000,$dff09a
X move.l parmtxt(PC),d0
X bsr bytedec
X move.l #clrtxt,d0
X bra putnam
X
X;change the number of maximum lines in the history buffer
Xhistorylines
X bsr getnum
X tst.b d7
X beq syntax
X move.w d2,maxhlines
X move.w hnum(PC),d0
X1$ cmp.w maxhlines(PC),d0
X ble.s 2$
X bsr remhistline
X subq #1,d0
X bra.s 1$
X2$ move.l history+8,curhist
X move.w d0,hnum
X rts
X;set the minimum number of characters a input line
X;must have to be added to the history buffer
Xhistorylength
X bsr getnum
X tst.b d7
X beq syntax
X tst.b d2
X bne.s 1$
X addq #1,d2
X1$ move.w d2,minnumchars
X rts
X;display all lines in the history buffer
Xshowhistory move.l history(PC),a5
X moveq #1,d5
X1$ tst.l 0(a5)
X beq.s 2$
X move.l d5,d3
X bsr bytedec
X move.w 8(a5),d0
X ext.l d0
X lea 10(a5),a0
X lea inputbuffer,a1
X CALL CopyMem,_SysBase(PC)
X move.w 8(a5),d0
X lea inputbuffer,a1
X clr.b 0(a1,d0.w)
X move.l a1,d0
X bsr putnam
X addq #1,d5
X move.l 0(a5),a5
X bra.s 1$
X2$ rts
X
X;set the maximum lines the output buffer may hold
Xoutputlines bsr getnum
X tst.b d7
X beq syntax
X moveq #100,d3
X tst.l d2
X bmi.s 2$
X cmp.l d3,d2
X bge.s 1$
X2$ move.l d3,d2
X1$ move.l d2,maxlines
X rts
X
X;find a named node
X;d7 = number of lists to search through
X;a4 = pointer to the first entry in the
X; list-offset-table
X;a5 = pointer to name
X;returns:
X;d7 = TRUE/FALSE 1/0
X;d0 = node
X
Xfindnam tst.b 0(a5)
X bne.s 1$
X move.l #nameerr,d0
X bsr putnam
X bra fnerr
X1$ cmp.b #'$',0(a5)
X bne.s fn2
X move.l d7,d2
X move.l a5,a0
X bsr readhex
X tst.b d7
X beq.s fn6
X move.l d2,d7
X bsr tstnode
X tst.l d5
X bne.s fn3
X bra fn5
Xfn6 move.l d2,d7
Xfn2 move.l _SysBase(PC),a0
X adda.l 0(a4),a0
X move.l a5,a1
Xfn4 CALL FindName,_SysBase(PC)
X tst.l d0
X bne.s fn1
X addq #4,a4
X dbf d7,fn2
Xfn5 move.l #namerr,d0
X bsr putstr
X move.l a5,d0
X bsr putnam
Xfnerr clr.b d7
X rts
Xfn1 move.b procnum(PC),d2
X beq.s fn3
X move.l d0,a0
X cmp.b 143(a0),d2
X bne.s fn4
Xfn3 moveq.l #1,d7
X rts
X
X;list-offset-table
XTRuNode dc.l 276
XTReNode dc.l 406
XTWaNode dc.l 420
XDevNode dc.l 350
XLibNode dc.l 378
XResNode dc.l 336
XMemNode dc.l 322
XPorNode dc.l 392
XSemNode dc.l 532
X
X;Node has been entered in hex. Check if this node exsists
Xtstnode tst.b fromfile
X bne.s illegalhex
X move.l d0,d1
X btst #0,d1
X beq.s inrange
X move.l #adrerr,d0
X bsr putnam
Xillegalhex moveq #0,d5
X rts
Xinrange movem.l d7/a4,-(a7)
X cmp.l #TRuNode,a4
X bne.s inrange1
X move.l _SysBase(PC),a0
X cmp.l 276(a0),d0
X beq.s nodefound
X subq #1,d7
X addq #4,a4
Xinrange1 move.w #$4000,$dff09a
Xgetlist move.l _SysBase(PC),a0
X add.l 0(a4),a0
Xnxtnode tst.l 0(a0)
X beq.s nxtlist
X cmp.l a0,d0
X beq.s nodefound
X move.l 0(a0),a0
X bra.s nxtnode
Xnxtlist addq #4,a4
X dbf d7,getlist
X move.w #-$4000,$dff09a
X movem.l d0/d7/a4,-(a7)
X bsr ResumeOutput
X move.l #noderr,d0
X bsr putnam
X bsr readline
X movem.l (a7)+,d0/d7/a4
X cmp.b #'y',inputbuffer
X beq.s nodefound1
X moveq #0,d5
X movem.l (a7)+,d7/a4
X rts
Xnodefound move.w #-$4000,$dff09a
Xnodefound1 move.b #1,d5
Xetst movem.l (a7)+,d7/a0
X rts
X
X;allocate FileInfoBlock
Xallocfinfo move.l #260,d0
X moveq #0,d1
X CALL AllocMem,_SysBase(PC)
X move.l d0,finfoptr
X rts
X
X;free FileInfoBlock
Xfreefinfo move.l #260,d0
X move.l finfoptr(PC),d1
X beq.s 1$
X move.l d1,a1
X CALL FreeMem,_SysBase(PC)
X1$ rts
X
X;Examine ,d0=Lock
Xgetfinfo move.l d0,d1
X move.l finfoptr,d2
X CALL Examine,dosbase(PC)
X rts
X
X;construct a Pathname from a lock
X;d0=Lock ,resulting string is written to window
Xgetpath movem.l d1-d7/a0-a6,-(a7)
X move.l d0,d1
X beq.s 1$
X CALL DupLock,dosbase(PC)
X1$ lea out,a4
X clr.b -(a4)
Xgp0 move.l d0,-(a7)
X bsr getfinfo
X move.l finfoptr,a0
X move.l 4(a0),d4
X addq #8,a0
X bsr strlen
X lea -1(a4),a5
X tst.l d4
X bmi.s nodir
X move.b #'/',-(a4)
Xnodir subq #1,d0
X bmi.s nofnam
Xgp1 move.b 0(a0,d0),-(a4)
X dbf d0,gp1
Xnofnam move.l 0(a7),d1
X CALL ParentDir,dosbase(PC)
X move.l d0,d4
X move.l (a7)+,d1
X beq.s 2$
X CALL UnLock,dosbase(PC)
X2$ move.l d4,d0
X bne gp0
Xputall cmp.b #'/',0(a5)
X bne.s gp2
X move.b #':',0(a5)
Xgp2 move.l a4,d0
X bsr putnam
X movem.l (a7)+,d1-d7/a0-a6
X rts
Xstrlen move.l a0,-(a7)
X move.l #-1,d0
Xstrl2 addq.l #1,d0
X tst.b (a0)+
X bne.s strl2
X move.l (a7)+,a0
X rts
Xstrlen2 move.l a0,-(a7)
X move.l #-1,d0
Xstrl22 addq.l #1,d0
X cmp.b #10,(a0)+
X bne.s strl22
X move.l (a7)+,a0
X rts
X
X;write a title and underline
X;a0 = pointer to text
Xputhead1 bsr strlen
X move.l d0,d5
X move.l a0,d0
X bra putstr
X
Xputhead2 bsr strlen
X add.l d0,d5
X bra.s ph2
X
Xputhead bsr strlen
X move.l d0,d5
Xph2 move.l a0,d0
X bsr putnam
X lea out,a0
X move.l a0,d0
Xph1 move.b #'-',(a0)+
X dbf d5,ph1
X move.b #$0a,(a0)+
X clr.b 0(a0)
X bra putstr
X
X;move cursor to a column
X;d0 = current position
X;d1 = column
Xtab move.l a3,-(a7)
X lea out,a3
Xsp5 cmp.b d1,d0
X bcc.s sp4
X move.b #' ',0(a3,d0)
X addq.b #1,d0
X bra.s sp5
Xsp4 move.l d1,ptr
X move.l (a7)+,a3
X rts
X
X;convert ascii to byte
X;a0 = pointer to text
X;d0 = byte
Xgetnum cmp.b #'$',0(a0)
X bne.s isdec
X bsr readhex
X move.l d0,d2
X rts
Xisdec moveq #0,d2
X move.l d2,d3
X move.l d2,d6
X move.l d2,d7
X cmp.b #'-',0(a0)
X bne.s gn1
X addq #1,a0
X moveq.l #1,d6
Xgn1 move.b (a0)+,d3
X cmp.b #'9',d3
X bhi.s gn2
X cmp.b #'0',d3
X bcs.s gn2
X moveq #1,d7
X and.b #$f,d3
X muls #10,d2
X add.l d3,d2
X bra.s gn1
Xgn2 tst.b d6
X beq.s gn3
X neg.l d2
Xgn3 tst.b d7
X bne.s gn4
X subq #1,a0
Xgn4 rts
X
X;convert hex to longword
X;a0 = pointer to text
X;returns d0=value
X;d7 = ok/error 1/0
Xreadhex movem.l d1-d6/a1-a5,-(a7)
X moveq #1,d7
X cmp.b #'$',0(a0)
X bne.s rh3
X addq #1,a0
Xrh3 moveq #0,d0
X cmpi.b #10,0(a0)
X beq.s rherr
X lea hextab(pc),a1
Xrh0 move.b (a0)+,d3
X moveq.l #15,d2
Xrh1 cmp.b 0(a1,d2),d3
X beq.s rh2
X dbf d2,rh1
X bra rhend
Xrh2 lsl.l #4,d0
X or.b d2,d0
X bra.s rh0
Xrhend tst.b d3
X beq.s rhok
X cmpi.b #10,d3
X beq.s rhok
X cmpi.b #' ',d3
X beq.s rhok
Xrherr moveq #0,d7
Xrhok movem.l (a7)+,d1-d6/a1-a5
X rts
X
X;skip blanks
X;a0 pointer to text
X; returns a0 = new pointer position
Xkllblnks cmpi.b #' ',0(a0)
X bne.s gn4
X addq #1,a0
X bra.s kllblnks
X
X; exit program. If background flag is set, wait for
X; amiga-amiga-x
X
Xstopall addq #4,a7
X bra exitall
X
Xexit tst.b background
X bne quithold
Xexitall bsr killpage
X bsr freeblank
X bsr killhistory
X move.l stplist(PC),a3
X tst.l 0(a3)
X beq.s ex0
X move.l a3,d0
X bsr waok
X bra.s exitall
X
Xex0 tst.b background
X beq.s ex1
X bsr removeh
X
Xex1 move.l _SysBase(PC),a1
X move.l #_LVOSwitch,a0
X move.l oldswitch,d0
X CALL SetFunction,_SysBase(PC)
X moveq #3,d0
X lea IOCounter(PC),a1
X CALL RemIntServer,_SysBase(PC)
X
X move.l replyport(PC),-(a7)
X LIBCALL DeletePort
X addq #4,a7
X bsr stoptimer
X lea timerio,a1
X CALL CloseDevice,_SysBase(PC)
X move.l timerport(PC),-(a7)
X LIBCALL DeletePort
X addq #4,a7
X
X bsr restoretrap
X
X tst.l wnptr
X beq.s 5$
X move.l wnptr(PC),a0
X CALL CloseWindow,intuibase(PC)
X5$ tst.b ownscreen
X beq.s 6$
X move.l screenptr(PC),a0
X CALL CloseScreen,intuibase(PC)
X clr.l screenptr
X
X6$ move.l fileptr(PC),d1
X beq.s ex11
X CALL Close,dosbase(PC)
Xex11 bsr freehidmem
X bsr freealias
X move.l realstack(PC),a7
X IFND DEBUG
X CALL Forbid,_SysBase(PC)
X move.l wbmsg(PC),d0
X beq.s todos
X move.l d0,a1
X CALL ReplyMsg,_SysBase(PC)
X moveq #0,d0
X rts
X
Xtodos move.l myseg(PC),d1
X CALL UnLoadSeg,dosbase(PC)
X ENDC
X moveq #0,d0
X rts
X
X;print a bcpl-string
X;d0 = bcpl-pointer to bcpl-string
Xputbcpl movem.l d3/a0-a1,-(a7)
X tst.l d0
X beq.s pb1
X lsl.l #2,d0
X move.l d0,a1
X moveq #0,d3
X move.b (a1)+,d3
X subq #1,d3
X move.l ptr(PC),d0
X lea out,a0
Xpb2 move.b (a1)+,0(a0,d0)
X beq.s 1$
X addq.b #1,d0
X dbf d3,pb2
X1$ move.l d0,ptr
Xpb1 movem.l (a7)+,d3/a0-a1
X rts
X
X;compare strings
X;a0/a1 = pointers to string
X;returns d0 = true(0) false(1), d1 = length
Xstrcmp movem.l a0-a1,-(a7)
X moveq #0,d0
X move.l d0,d1
Xsrc2 move.b (a0)+,d0
X beq.s src1
X cmp.b #10,d0
X beq.s src1
X addq #1,d1
X cmp.b (a1)+,d0
X beq.s src2
X bra.s src3
Xsrc1 move.b 0(a1),d0
Xsrc3 movem.l (a7)+,a0-a1
X rts
X
Xstrbuf movem.l d0/a1-a2,-(a7)
X move.l a0,a1
X lea buffer,a2
X1$ move.b (a1)+,d0
X cmp.b #10,d0
X beq.s 2$
X cmp.b #' ',d0
X beq.s 2$
X or.b #' ',d0
X beq.s 2$
X move.b d0,(a2)+
X bra.s 1$
X2$ clr.b (a2)+
X movem.l (a7)+,d0/a1-a2
X rts
X
X;compare bcpl string with string
X;a0 = pointer to string
X;a2 = bcpl-pointer to bcpl-string
X;returns d0 = true(0) false(1)
Xstrbcmp movem.l d1/a0/a2,-(a7)
X moveq #0,d0
X moveq #0,d1
X adda.l a2,a2
X adda.l a2,a2
X move.b (a2)+,d1
X beq.s stb1
X subq #1,d1
Xstb2 cmp.b (a2)+,(a0)+
X bne.s stb1
X dbf d1,stb2
X moveq #1,d0
Xstb1 movem.l (a7)+,d1/a0/a2
X rts
X
X;convert long to decimal
X;d0 = value
X;d3 bit 0 = left/right justified
X;d3 bit 1 = write/leave
X;returns string in 'buffer'
Xlongdec movem.l d1-d2/a1-a2,-(a7)
X lea binarea+8(PC),a1
X move.l #' ',-8(a1)
X move.l #' ',-4(a1)
X clr.b 0(a1)
X subq #1,a1
X cmp #2,d3
X bne.s ld5
X clr.b 0(a1)
Xld5 moveq #1,d2
Xld2 addq #1,d2
X moveq #$a,d1
X bsr div
X addi.l #$30,d1
X move.b d1,-(a1)
X tst.l d0
X bne.s ld2
X
X btst #0,d3
X bne.s ld1
X lea binarea(PC),a2
X cmpa.l a2,a1
X bne.s ld3
X subq.l #1,ptr
X bra.s ld1
Xld3 move.b 0(a1),(a2)+
X move.b #' ',(a1)+
X dbf d2,ld3
Xld1 cmp #2,d3
X beq.s ld4
X move.l #binarea,d0
X bsr putstr
Xld4 movem.l (a7)+,d1-d2/a1-a2
X rts
X
X;write UBYTE
X;d3 = value
Xbytedec bsr dec
X move.l #decimal,d0
X bra.s pm1
X
X;write signed byte
X;d3 = value
Xplusmins movem.l d5/a3,-(a7)
X move.w #$2020,minus
X move.b d3,d5
X bpl.s 2$
X neg.b d3
X2$ bsr.s dec
X tst.b d5
X bpl.s 1$
X move.l d0,a3
X move.b #'-',-(a3)
X1$ movem.l (a7)+,d5/a3
X move.l #minus+1,d0
Xpm1 bra putstr
X
Xdec movem.l d3/a3,-(a7)
X move.l #$20202020,decimal
X and.l #$ff,d3
X lea decimal+3(PC),a3
Xbloop tst.b d3
X beq.s bend
X divu #10,d3
X swap d3
X ori.b #'0',d3
X move.b d3,-(a3)
X clr.w d3
X swap d3
X bra.s bloop
Xbend cmpa.l #decimal+3,a3
X bne 1$
X move.b #'0',-(a3)
X1$ move.l a3,d0
X movem.l (a7)+,d3/a3
X rts
X
X;write a string, move cursor into next line
X;d0 = pointer to text
Xputnam bsr putstr
Xputnam1 tst.b d0
X beq.s ncr
X bsr newline
Xncr rts
X
X;write one char
X;d0 = char
Xputchar movem.l d1/a0,-(a7)
X move.l ptr(PC),d1
X lea out,a0
X move.b d0,0(a0,d1)
X addq.l #1,ptr
X movem.l (a7)+,d1/a0
X rts
X
X;write a string, strings are only put into the output buffer when
X;a LF is detected
X;d0 = pointer to string
X;returns d0 = cursor position
Xputstr movem.l d1-d7/a0-a6,-(a7)
X move.b #1,printed
X move.l d0,a2
X lea out,a3
X move.l ptr(PC),d0
X move.l a2,d5
X bne pst1
X lea longnix(PC),a2
X
Xpst1 move.b (a2)+,d1
X cmpi.b #13,d1
X beq pst1
X cmpi.b #10,d1
X beq.s lineend
X move.b d1,0(a3,d0)
X beq prend
X cmp #100,d0
X bge.s pst1
X addq #1,d0
X bra.s pst1
X
Xlineend tst.b fromfile
X beq.s 1$
X moveq #0,d0
X bra prend
X
X1$ tst.l lastprinted
X bne.s 2$
X bsr killpage
X
X2$ addq #1,d0
X move.l d0,-(a7)
X add #14,d0
X moveq #0,d1
X CALL AllocMem,_SysBase(PC)
X move.l (a7)+,d1
X tst.l d0
X beq prend
X move.l d0,a0
X move.w d1,12(a0)
X cmp.w maxllength(PC),d1
X ble.s 7$
X move.w d1,maxllength
X7$ move.l node,8(a0)
X clr.l node
X clr.l 0(a0)
X
X move.l lastprinted(PC),d0
X move.l d0,4(a0)
X bne.s 3$
X move.l a0,outchain
X bra.s 4$
X3$ move.l d0,a1
X move.l a0,0(a1)
X4$ move.l a0,lastprinted
X move.b #' ',14(a0)
X subq #1,d1
X lea 15(a0),a0
X lea out,a1
X subq #1,d1
X bmi.s 6$
X5$ move.b (a1)+,(a0)+
X dbf d1,5$
X6$ move.l numlines(PC),d2
X cmp.l maxlines(PC),d2
X ble.s 8$
X
X move.l outchain(PC),a1
X move.l 0(a1),a2
X move.l a2,outchain
X clr.l 4(a2)
X move.w 12(a1),d0
X add.w #14,d0
X ext.l d0
X CALL FreeMem,_SysBase(PC)
X bra.s 9$
X
X8$ addq.l #1,d2
X move.l d2,numlines
X
X9$ moveq #0,d0
X move.l d0,d5
X tst.b addlines
X beq pst1
X bsr addline
X bra pst1
Xprend move.l d0,ptr
X movem.l (a7)+,d1-d7/a0-a6
X rts
X
X;Kill output buffer
Xkillpage movem.l d0-d7/a0-a6,-(a7)
X tst.l outchain
X beq.s 2$
X move.l outchain(PC),a1
X bsr killlines
X clr.l outchain
X clr.l lastprinted
X clr.l numlines
X clr.w maxllength
X2$ movem.l (a7)+,d0-d7/a0-a6
X rts
X
X;kill the remainder of the output buffer
Xkilllines move.l 0(a1),-(a7)
X move.w 12(a1),d0
X ext.l d0
X add #14,d0
X CALL FreeMem,_SysBase(PC)
X move.l (a7)+,a1
X move.l a1,d7
X bne.s killlines
X rts
X
Xfreeblank move.l blanks(PC),d0
X beq.s 1$
X move.l d0,a1
X move.w colms(PC),d0
X ext.l d0
X CALL FreeMem,_SysBase(PC)
X clr.l blanks
X1$ rts
X
X;write a portion of the output buffer to the screen
Xblastout move.l rastport(PC),a1
X moveq #1,d0
X CALL SetAPen,gfxbase(PC)
X move.l rastport(PC),a1
X moveq #1,d0
X CALL SetDrMd,gfxbase(PC)
X moveq #0,d7
X
X move.w loffset(PC),d2
X beq.s 7$
X move.w colms(PC),d4
X add.w d4,d2
X move.w maxllength(PC),d3
X cmp.w d3,d2
X ble.s 7$
X move.w d3,d2
X sub.w d4,d2
X bpl.s 8$
X moveq #0,d2
X8$ move.w d2,loffset
X
X7$ bsr tstfirstlin
X
X1$ tst.l outchain
X beq.s 3$
X bsr findline
X
X2$ move.w colms(PC),d5
X ext.l d5
X move.w loffset(PC),d4
X ext.l d4
X moveq #18,d6
X6$ lea 14(a5,d4),a0
X move.w 12(a5),d3
X ext.l d3
X bsr blastline
X bge.s 3$
X tst.l 0(a5)
X beq.s 5$
X move.l 0(a5),a5
X bra 6$
X5$ moveq #0,d3
X bsr blastline
X bcs.s 5$
X3$ rts
X
X;get a pointer to a line (line # in d0)
Xfindline move.l outchain(PC),d1
X beq 2$
X move.l d1,a5
X1$ tst d0
X beq.s 2$
X tst.l 0(a5)
X beq.s 2$
X move.l 0(a5),a5
X dbf d0,1$
X2$ rts
X
X;check if the display is as 'full' as possible
Xtstfirstlin move.l firstline(PC),d0
X move.l d0,d2
X add.w rows(PC),d2
X cmp.l numlines(PC),d2
X bmi.s 1$
X move.l numlines(PC),d2
X sub.w rows(PC),d2
X bpl.s 4$
X moveq #0,d2
X4$ move.l d2,d0
X move.l d2,firstline
X1$ rts
X
X;display one line, fill the gap between the end of the line and
X;the end of the window with spaces.
X;d6 = ypos, d5=colms, d3= linelength, d7= line # in window, a0 = text
X
Xblastline move d6,d1
X moveq #6,d0
X move.l rastport(PC),a1
X CALL Move,gfxbase(PC)
X sub.w d4,d3
X bpl.s 7$
X moveq #0,d3
X bra.s 6$
X7$ cmp.w d5,d3
X bmi.s 4$
X move.w d5,d3
X4$ move.l d3,d0
X beq.s 6$
X CALL Text,gfxbase(PC)
X6$ move.l d5,d0
X sub.l d3,d0
X ble.s 5$
X move.l blanks(PC),a0
X move.l rastport(PC),a1
X CALL Text,gfxbase(PC)
X5$ addq #8,d6
X addq #1,d7
X cmp.w rows(PC),d7
X rts
X
X;Write pointer, display '-------' if empty
Xhexan tst.l d0
X bne.s hexa
X bra putstr
X
X;Write 8 byte hex value
X;d0 = value
Xhexa bsr gthex
X bra putstr
X
Xgthex movem.l d1-d7/a0-a6,-(a7)
X moveq.l #7,d5
X lea hexarea(PC),a1
X lea hextab(PC),a0
X moveq #0,d2
Xhexloop move.b d0,d2
X and.b #15,d2
X move.b 0(a0,d2),0(a1,d5)
X lsr.l #4,d0
X dbf d5,hexloop
X move.l a1,d0
X movem.l (a7)+,d1-d7/a0-a6
X rts
X
X;Convert/write byte into binary string
X;d0 = value
Xbin movem.l d1-d7/a0-a6,-(a7)
X lea binarea(PC),a0
X move.w #$2020,8(a0)
X moveq.l #7,d4
Xbinloop moveq.l #'0'/2,d1
X roxr.b #1,d0
X roxl.b #1,d1
X move.b d1,0(a0,d4)
X dbf d4,binloop
X move.l a0,d0
X movem.l (a7)+,d1-d7/a0-a6
X bra putstr
X
X;send a packet
X;a0 = msgport
X;dp_Type and dp_Arg1 have to be inizialized
Xcons1 movem.l d0-d7/a0-a6,-(a7)
X move.l #dp_Link,LN_NAME
X move.l #mypacket,dp_Link
X move.l replyport(PC),dp_Port
X lea mypacket,a1
X CALL PutMsg,_SysBase(PC)
X move.l replyport,a0
X CALL WaitPort,_SysBase(PC)
X move.l replyport(PC),a0
X CALL GetMsg,_SysBase(PC)
X movem.l (a7)+,d0-d7/a0-a6
X rts
X
X;32-bit division
X;d0 / d1
X;returns d0
Xdiv movem.l d2-d3,-(a7)
X tst.l d1
X beq div8
X swap d1
X move.w d1,d2
X bne.s div1
X swap d0
X swap d1
X swap d2
X move.w d0,d2
X beq.s div2
X divu d1,d2
X move.w d2,d0
Xdiv2 swap d0
X move.w d0,d2
X divu d1,d2
X move.w d2,d0
X swap d2
X move.w d2,d1
X bra div8
Xdiv1 moveq #$10,d3
X cmpi.w #$80,d1
X bcc.s div3
X rol.l #8,d1
X subq.w #8,d3
Xdiv3 cmpi.w #$800,d1
X bcc.s div4
X rol.l #4,d1
X subq.w #4,d3
Xdiv4 cmpi.w #$2000,d1
X bcc.s div5
X rol.l #2,d1
X subq.w #2,d3
Xdiv5 tst.w d1
X bmi.s div6
X rol.l #1,d1
X subq.w #1,d3
Xdiv6 move.w d0,d2
X lsr.l d3,d0
X swap d2
X clr.w d2
X lsr.l d3,d2
X swap d3
X divu d1,d0
X move.w d0,d3
X move.w d2,d0
X move.w d3,d2
X swap d1
X mulu d1,d2
X sub.l d2,d0
X bcc.s div7
X subq.w #1,d3
X add.l d1,d0
Xdiv7 moveq #0,d1
X move.w d3,d1
X swap d3
X rol.l d3,d0
X swap d0
X exg d1,d0
Xdiv8 movem.l (a7)+,d2-d3
X rts
X
X;install a input-handler
Xinstallh pea 0
X pea xopsleep
X LIBCALL CreatePort
X addq #8,a7
X move.l d0,InputMsg
X move.l d0,-(a7)
X LIBCALL CreateStdIO
X addq #4,a7
X move.l d0,InRequest
X move.l d0,a1
X lea devicenam(PC),a0
X moveq #0,d0
X moveq #0,d1
X CALL OpenDevice,_SysBase(PC)
X move.l d0,devstatus
X movea.l InRequest(PC),a1
X move.l #InInterrupt,40(a1)
X move.w #9,28(a1)
X CALL DoIO,_SysBase(PC)
X move.l d0,iostatus
X move.l #-1,d0
X CALL AllocSignal,_SysBase(PC)
X moveq #0,d1
X bset d0,d1
X move.l d1,mysignal
X rts
X
X;remove handler
Xremoveh movea.l InRequest(PC),a1
X move.l #InInterrupt,40(a1)
X move.w #10,28(a1)
X CALL DoIO,_SysBase(PC)
X movea.l InRequest(PC),a1
X CALL CloseDevice,_SysBase(PC)
X move.l InRequest,-(a7)
X LIBCALL DeleteStdIO
X addq #4,a7
X move.l InputMsg,-(a7)
X LIBCALL DeletePort
X addq #4,a7
X rts
X
X;this is the handler, it checks if amiga-amiga-x
X;has been pressed and signals it to our task
XKeyhandler tst.b running
X bne.s endhandler
X cmp.b #1,4(a0)
X bne.s endhandler
X move.w 8(a0),d0
X andi.w #$c0,d0
X cmpi.w #$c0,d0
X bne.s endhandler
X cmp.w #$32,6(a0)
X bne.s endhandler
Xwakeup move.l a0,-(a7)
X movea.l mytask(PC),a1
X move.l mysignal(PC),d0
X CALL Signal,_SysBase(PC)
X move.l (a7)+,a0
X clr.b 4(a0)
Xendhandler move.l a0,d0
X rts
X
Xsnoop bsr cls
X bsr nodenam
X moveq #1,d7
X lea TReNode(PC),a4
X bsr findnam
X tst.b d7
X bne.s 1$
X move.l #stperr,d0
X bra putnam
X1$ move.l d0,captask
X pea 0
X pea memportname
X LIBCALL CreatePort
X addq #8,a7
X move.l d0,snoopport
X beq tm6
X
X bsr replyintui
X move.b #1,addlines
X lea snoophead(PC),a0
X bsr puthead
X move.l _SysBase(PC),a1
X move.l -196(a1),oldalloc
X move.l -208(a1),oldfree
X move.l #capmalloc,d0
X move.l #-198,a0
X CALL SetFunction,_SysBase(PC)
X move.l _SysBase(PC),a1
X move.l #capmfree,d0
X move.l #-210,a0
X CALL SetFunction,_SysBase(PC)
X clr.b bool
X clr.b cbreak
X
Xwaitmem move.l snoopport(PC),a0
X moveq #0,d1
X move.b 15(a0),d1
X bset d1,d0
X move.l d0,auxsig
X bsr processmsgs
X
Xtm7 move.l mytask(PC),a0
X move.l snoopport(PC),a0
X CALL GetMsg,_SysBase(PC)
X tst.l d0
X bne tm8
X tst.b cbreak
X bne snoopend
X bra waitmem
Xtm8 move.l d0,a3
X move.l 20(a3),d3
X btst #31,d3
X beq freed
X move.l #allok,d0
X bsr putstr
X lea memname(PC),a2
X lea membit(PC),a4
X moveq #4,d5
Xtm2 move.l 0(a4),d4
X btst d4,d3
X beq.s tm1
X move.l 0(a2),d0
X bsr putstr
Xtm1 addq #4,a2
X addq #4,a4
X dbf d5,tm2
X moveq #26,d1
X bsr tab
X move.l 24(a3),d0
X move.l d0,d3
X bsr hexa
X move.l 28(a3),d0
X bne.s tm3
X move.l #failed,d0
X bsr putstr
X moveq #53,d1
X bsr tab
X bra tm4
Xtm3 bsr hexa
X move.l 28(a3),d0
X add.l d3,d0
X bsr hexa
X bra tm4
X
Xfreed move.l #free,d0
X bsr putstr
X move.b #'-',d0
X moveq #18,d1
Xtm9 bsr putchar
X dbf d1,tm9
X move.b #' ',d0
X bsr putchar
X move.l d3,d0
X bsr hexa
X move.l 24(a3),d0
X bsr hexa
X move.l 24(a3),d0
X add.l d3,d0
X bsr hexa
X
Xtm4 move.l 32(a3),d0
X bsr hexa
X bsr newline
X move.w 18(a3),d0
X ext.l d0
X move.l a3,a1
X CALL FreeMem,_SysBase(PC)
X bra tm7
X
Xsnoopend move.l _SysBase(PC),a1
X move.l oldalloc(PC),d0
X move.l #-198,a0
X CALL SetFunction,_SysBase(PC)
X move.l _SysBase(PC),a1
X move.l oldfree,d0
X move.l #-210,a0
X CALL SetFunction,_SysBase(PC)
X move.l snoopport,-(a7)
X LIBCALL DeletePort
X addq #4,a7
X move.l #stoped,d0
X bsr putnam
X clr.b addlines
X clr.l auxsig
Xtm6 rts
X
Xmemname dc.l memlarg,memclr,memfast,memchip,mempubl
Xmembit dc.l 17,16,2,1,0
X
Xcapmalloc movem.l d0-d7/a0-a6,-(a7)
X move.l _SysBase(PC),a6
X move.l 276(a6),d4
X cmp.l captask(PC),d4
X bne.s capm1
X tst.b bool
X bne capm1
X move.b #1,bool
X moveq #36,d6
X bsr allocmsg
X beq capm2
X bset #31,d1
X move.l d1,20(a5)
X move.l d0,24(a5)
X move.l 60(a7),32(a5)
X move.l a5,remembr
X movem.l (a7)+,d0-d7/a0-a6
X bsr memalloc
X movem.l d0-d7/a0-a6,-(a7)
X move.l remembr(PC),a1
X move.l d0,28(a1)
X move.l snoopport,a0
X move.b #5,8(a1)
X CALL PutMsg,_SysBase(PC)
X clr.b bool
X movem.l (a7)+,d0-d7/a0-a6
X rts
Xcapm2 clr.b bool
Xcapm1 movem.l (a7)+,d0-d7/a0-a6
Xmemalloc dc.w $4ef9
Xoldalloc dc.l 0
X
Xcapmfree movem.l d0-d7/a0-a6,-(a7)
X move.l _SysBase(PC),a6
X move.l 276(a6),d4
X cmp.l captask(PC),d4
X bne.s capf1
X tst.b bool
X bne.s capf1
X move.b #1,bool
X moveq #36,d6
X bsr allocmsg
X beq.s capf2
X move.l d0,20(a5)
X move.l a1,24(a5)
X move.l 60(a7),32(a5)
X move.l snoopport,a0
X move.b #5,8(a5)
X move.l a5,a1
X CALL PutMsg,_SysBase(PC)
Xcapf2 clr.b bool
Xcapf1 movem.l (a7)+,d0-d7/a0-a6
X dc.w $4ef9
Xoldfree dc.l 0
X
Xallocmsg movem.l d0-d1/a0-a1,-(a7)
X move.l d6,d0
X move.l #65536,d1
X bsr memalloc
X tst.l d0
X beq.s alm1
X move.l d0,a5
X move.w d6,18(a5)
Xalm1 movem.l (a7)+,d0-d1/a0-a1
X move.l a5,d6
X rts
X
Xmyswitch movem.l d0-d1/a0-a1,-(a7)
X move.l _SysBase(PC),a0
X move.l 276(a0),d0
X move.l tasksnum(PC),d1
X lea cputime,a0
X subq.l #1,d1
X bmi.s swadd
Xsw0 cmp.l (a0)+,d0
X dbeq d1,sw0
X tst d1
X bmi.s swadd
Xswi1 add.l #1,508(a0)
Xswgo movem.l (a7)+,d0-d1/a0-a1
X dc.w $4ef9
Xoldswitch dc.l 0
Xswadd cmp.l #125,tasksnum
X bge.s swgo
X addq.l #1,tasksnum
X move.l d0,0(a0)
X move.l #1,512(a0)
X bra.s swgo
X
Xcountio addq.l #1,iocount
X moveq #0,d0
Xcio1 rts
X
Xiconbackdrp tst.b iconifyon
X beq.s 1$
X lea icnwindow,a0
X eor.l #$100,14(a0) ;wn_Flags
X1$ rts
X
Xiconifyoff tst.b iconifyon
X beq.s cio1
X clr.b iconifyon
X tst.b fromfile
X bne.s 1$
X move.l wnptr(PC),d0
X beq.s 1$
X move.l d0,a0
X lea iconifgad,a1
X CALL RemoveGadget,intuibase(PC)
X move.l wnptr(PC),a0
X CALL RefreshWindowFrame,intuibase(PC)
X1$ move.l #iconify,d0
X
Xkillseg movem.l d1-d2/a0-a4,-(a7)
X subq #4,d0
X move.l 4,a6
X move.l 276(a6),a4
X move.l 128(a4),d1
X lsl.l #2,d1
X move.l d1,a3
X move.l 12(a3),d1
X bne.s 2$
X move.l 172(a4),d1
X lsl.l #2,d1
X move.l d1,a4
X move.l 60(a4),d1
X
X2$ lsl.l #2,d1
X cmp.l d0,d1
X beq.s 4$
X move.l d1,a4
X move.l 0(a4),d1
X beq.s 5$
X bra.s 2$
X
X4$ move.l d1,a0
X move.l 0(a0),0(a4)
X clr.l 0(a0)
X lsr.l #2,d1
X CALL UnLoadSeg,dosbase(PC)
X movem.l (a7)+,d1-d2/a0-a4
X5$ rts
X
Xalert bsr stoptimer
X move.l excpttask(PC),d0
X bne.s alert1
X move.l #noguru,d0
X bra putnam
Xalert1 move.l #softfail,d0
X bsr putstr
X move.l excpttask(PC),a0
X move.l 10(a0),d0
X bsr putnam
X cmp.l #3,excpterror
X bne.s 1$
X move.l #addrserr,d0
X bsr putstr
X move.l excptaddr(PC),d0
X bsr hexa
X bsr newline
X1$ move.l #procount,d0
X bsr putstr
X move.l excptpc(PC),d0
X bsr hexa
X bsr newline
X move.l #gurutxt,d0
X bsr putstr
X move.l excpterror(PC),d0
X bsr hexa
X lea out,a0
X move.l ptr(PC),d0
X move.b #'.',-1(a0,d0)
X move.l excpttask(PC),d0
X bsr hexa
X bra newline
X
Xshowguru bsr alert
X tst.b ownscreen
X bne.s 5$
X move.l wnptr(PC),a0
X CALL WindowToFront,intuibase(PC)
X bra.s 2$
X5$ move.l screenptr,a0
X CALL ScreenToFront,intuibase(PC)
X2$ move.l #whatnow,d0
X bsr putnam
X clr.l oldpageend
X bsr readline
X
X cmp.b #'i',inputbuffer
X beq.s 4$
X1$ cmp.b #'k',inputbuffer
X bne.s 2$
X move.l excpttask(PC),a1
X tst.l 22(a1)
X bne.s 3$
X CALL RemTask,_SysBase(PC)
X bra.s 4$
X3$ move.l a1,d0
X bsr canok
X4$ clr.l lastprinted
X rts
X
Xmyaddtask move.l a3,-(a7)
X lea mytrap(PC),a3
X move.l 50(a1),d0
X beq.s 1$
X cmp.l oldtrap(PC),d0
X beq.s 1$
X lea myproctrap(PC),a3
X cmp.l oldproctrap(PC),d0
X bne.s 2$
X1$ move.l a3,50(a1)
X2$ move.l (a7)+,a3
X dc.w $4ef9
XOldAddTask dc.l 0
X
Xmyproctrap bsr traphandle
X dc.w $4ef9
Xoldproctrap dc.l 0
X
Xmytrap bsr traphandle
X moveq #0,d0
X CALL Wait,_SysBase(PC)
X dc.w $4ef9
Xoldtrap dc.l 0
X
Xtraphandle movem.l d0-d7/a0-a6,$180
X move.l 4,a6
X move.l 276(a6),excpttask
X move.l 4(a7),d0
X cmp.l #9,d0
X beq.s 2$
X move.l d0,excpterror
X moveq #10,d1
X cmp.l #3,d0
X bne.s 1$
X move.l 0(a7,d1.w),excptaddr
X moveq #18,d1
X1$ move.l 0(a7,d1.w),excptpc
X move.l mytask(PC),a1
X move.l trapsignal(PC),d0
X jsr _LVOSignal(a6)
X2$ movem.l $180,d0-d7/a0-a6
X rts
X
Xtrapguru tst.b wanttraps
X bne restoretrap
X move.b #1,wanttraps
X
Xaddtraps tst.b wanttraps
X beq 5$
X move.l 304(a6),oldtrap ;Original EXEC trap handler
X moveq #-1,d0
X CALL AllocSignal,_SysBase(PC)
X moveq #0,d1
X bset d0,d1
X move.l d1,trapsignal
X move.l #_LVOAddTask,a0 ;need a new AddTask() to change
X move.l 2(a6,a0),OldAddTask ;AmigaDos's default trap handler
X move.l a6,a1
X move.l #myaddtask,d0
X CALL SetFunction,_SysBase(PC)
X CALL Forbid,_SysBase(PC) ;change the trap handler of
X moveq #0,d5 ;aleady running tasks
X bsr getaskdat ;get task stucture pointers
X1$ tst.b entries
X beq.s 2$
X lea -16(a5),a5
X move.l 0(a5),a4 ;pointer to a task structure
X lea myproctrap(PC),a0
X move.l 50(a4),d0 ;Task->tc_TrapCode
X cmp.l oldproctrap(PC),d0 ;AmigaDos Handler ?
X beq.s 3$
X lea mytrap(PC),a0 ;EXEC Handler ?
X cmp.l oldtrap(PC),d0
X bne.s 4$ ;must be a custom one, skip it
X3$ move.l a0,50(a4) ;replace it
X4$ subq.b #1,entries
X bra.s 1$
X2$ CALL Permit,_SysBase(PC)
X5$ rts
X
Xrestoretrap tst.b wanttraps
X beq.s 6$
X tst.b fromfile
X bne.s 5$
X move.l #_LVOAddTask,a0
X move.l OldAddTask(PC),d0
X move.l _SysBase(PC),a1
X CALL SetFunction,_SysBase(PC)
X CALL Forbid,_SysBase(PC)
X bsr getaskdat
X1$ tst.b entries
X beq.s 2$
X lea -16(a5),a5
X move.l 0(a5),a4
X move.l oldproctrap(PC),a0
X move.l 50(a4),d0
X cmp.l #myproctrap,d0
X beq.s 3$
X move.l oldtrap(PC),a0
X cmp.l #mytrap,d0
X bne.s 4$
X3$ move.l a0,50(a4)
X4$ subq.b #1,entries
X bra.s 1$
X2$ CALL Permit,_SysBase(PC)
X clr.l trapsignal
X5$ clr.b wanttraps
X6$ rts
X
X;save the contents of the output buffer
X;to a file
Xsaveoutput bsr nodenam2
X tst.b 0(a5)
X beq syntax
X move.l a5,d1
X move.l #1006,d2
X CALL Open,dosbase(PC)
X move.l d0,d5
X bne.s 1$
X move.l #openerr,d0
X bsr putstr
X move.l a5,d0
X bra putnam
X1$ move.l outchain(PC),d0
X beq.s 3$
X2$ move.l d0,a5
X move.w 12(a5),d3
X beq.s 4$
X ext.l d3
X lea 14(a5),a1
X move.l a1,d2
X move.l d5,d1
X CALL Write,dosbase(PC)
X tst.l d0
X ble.s 3$
X4$ moveq #1,d3
X move.l d5,d1
X move.l #cr,d2
X CALL Write,dosbase(PC)
X tst.l d0
X ble.s 3$
X move.l 0(a5),d0
X bne.s 2$
X3$ move.l d5,d1
X CALL Close,dosbase(PC)
X rts
X
Xgrabtimerio lea tiohead(PC),a0
X bsr puthead
X move.b timeout(PC),d4
X move.b #255,timeout
X bsr starttimer
X move.b d4,timeout
X lea timerio,a1
X CALL Disable,_SysBase(PC)
X2$ move.l 0(a1),d2
X beq.s 1$
X move.l d2,a1
X bra.s 2$
X1$ CALL Enable,_SysBase(PC)
X lea -4(a1),a5
X bsr stoptimer
X lea buffer,a4
X moveq #1,d4
X bsr gettrq
X
X lea timerio,a0
X lea dummy,a1
X moveq #40,d0
X CALL CopyMem,_SysBase(PC)
X
X lea dummy,a1
X lea timernam(PC),a0
X moveq #0,d1
X moveq #0,d0
X CALL OpenDevice,_SysBase(PC)
X
X lea dummy,a1
X move.l #1<<30,32(a1)
X CALL SendIO,_SysBase(PC)
X
X lea dummy,a5
X CALL Disable,_SysBase(PC)
X8$ move.l 0(a5),d2
X beq.s 7$
X move.l d2,a5
X bra.s 8$
X7$ CALL Enable,_SysBase(PC)
X lea -4(a5),a5
X
X lea dummy,a1
X CALL AbortIO,_SysBase(PC)
X lea timerio,a1
X CALL WaitIO,_SysBase(PC)
X move.w timersig,d0
X moveq #0,d1
X bset d0,d1
X moveq #0,d0
X CALL SetSignal,_SysBase(PC)
X
X moveq #0,d4
X bsr gettrq
X
X lea dummy,a1
X CALL CloseDevice,_SysBase(PC)
X
X clr.l (a4)+
X lea -22(a4),a2
X moveq #18,d2
X bsr sortlist
X
X lea buffer,a5
X5$ move.l (a5)+,d0
X beq.s 6$
X bsr hexa
X move.w (a5)+,d0
X ext.l d0
X mulu #9,d0
X add.l #timerunits,d0
X bsr putstr
X move.l (a5)+,d3
X mulu #10,d3
X move.l (a5)+,d0
X move.l #100000,d1
X bsr div
X add.l d3,d0
X cmp.l #2559,d0
X ble.s 9$
X move.l #whatsthis,d0
X bsr putstr
X bra.s 10$
X9$ moveq #1,d6
X bsr putfrac
X10$ move.b #' ',d0
X bsr putchar
X move.l (a5)+,a1
X move.l 10(a1),d0
X bsr putnam
X bra.s 5$
X6$ rts
X
Xgettrq CALL Disable,_SysBase(PC)
X3$ move.l 0(a5),a5
X tst.l 0(a5)
X beq.s 4$
X move.l a5,(a4)+
X move.w d4,(a4)+
X move.l 32(a5),(a4)+
X move.l 36(a5),(a4)+
X move.l 14(a5),a1
X move.l 16(a1),(a4)+
X bra.s 3$
X4$ CALL Enable,_SysBase(PC)
X rts
X
X
X;check if the timer is runnig, start it if not
Xstarttimer lea timerio,a1
X cmp.b #5,8(a1)
X beq.s 1$
X moveq #0,d0
X move.l d0,36(a1)
X move.b timeout(PC),d0
X beq.s 1$
X move.l d0,32(a1)
X move.w #9,28(a1)
X CALL SendIO,_SysBase(PC)
X1$ rts
X;Abort a timer request, if pending
Xstoptimer lea timerio,a1
X cmp.b #5,8(a1)
X bne.s 1$
X CALL AbortIO,_SysBase(PC)
X lea timerio,a1
X CALL WaitIO,_SysBase(PC)
X1$ move.w timersig,d0
X moveq #0,d1
X bset d0,d1
X moveq #0,d0
X CALL SetSignal,_SysBase(PC)
X rts
X;Xoper main loop, process all incoming messages
Xprocessmsgs move.l wnptr(PC),a0
X moveq #0,d0
X move.w intuisig(PC),d1
X bset d1,d0
X move.w timersig(PC),d1
X bset d1,d0
X or.w #4096,d0
X or.l auxsig(PC),d0
X tst.l auxsig
X bne.s 1$
X or.l trapsignal(PC),d0
X1$ CALL Wait,_SysBase(PC)
X
X move.l d0,tasksigs
X
X move.l trapsignal(PC),d1
X and.l d0,d1
X beq.s ctrl_c
X tst.b gotguru
X bne.s ctrl_c
X move.b #1,gotguru
X bsr showguru
X clr.b gotguru
X
Xctrl_c move.q #12,d1
X bsr testsig
X bne exit
X
X
Xtimermsg move.w timersig(PC),d1
X bsr testsig
X beq intuimsgs
X tst.w repeat
X bne.s 1$
X bsr showwhat
X bra.s intuimsgs
X1$ move.w repeatlen,d0
X lea repeatbuffer,a2
X lea dummy,a1
X move.w d0,d1
X2$ move.b (a2)+,(a1)+
X dbf d1,2$
X bsr cli
X bsr starttimer
X
Xintuimsgs move.w intuisig(PC),d1
X bsr testsig
X beq processnxtmsg
Xnextimsg move.l wnptr(PC),a0
X move.l $56(a0),a0
X CALL GetMsg,_SysBase(PC)
X tst.l d0
X beq processnxtmsg
X move.l d0,intuimsg
X
X move.l d0,a0
X move.l 20(a0),d0
X
X cmp.l #$200,d0 ;CloseWindow
X bne.s 1$
X tst.b addlines
X beq exitall
X move.b #1,cbreak
X bra intuiend
X
X1$ cmp.l #2,d0 ;ResizeWindow
X bne.s 2$
X bsr setupscreen
X bra intuiend
X
X2$ cmp.l #4,d0 ;refresh
X bne.s 22$
X bsr putiline
X bsr blastout
X bsr UpdateIArea
X bra intuiend
X
X22$ tst.b addlines
X bne 3$
X cmp.l #$40,d0 ;gadgetup
X bne.s 3$
X tst.w getanswer
X bne.s 3$
X bsr replyintui
X bra instback
X
X3$ cmp.l #$400,d0 ;RawKey
X bne notarawkey
X move.w #$80,d0
X and.w 24(a0),d0
X bne intuiend
X and.w #$7f,24(a0)
X lea ievent,a1
X move.b #1,4(a1)
X move.l 24(a0),6(a1)
X move.w 26(a0),qualifier
X move.l a1,a0
X lea outevent,a1
X moveq #20,d1
X suba.l a2,a2
X CALL RawKeyConvert,condev(PC)
X tst.l d0
X beq intuiend
X lea inputbuffer,a1
X lea outevent,a2
X move.w curpos(PC),d4
X moveq #0,d3
X tst.b addlines
X bne 197$
X
X cmp.b #$9b,0(a2) ;CSI
X bne 110$
X
X cmp.b #'?',1(a2) ;help
X bne.s 399$
X tst.w getanswer
X bne.s 399$
X bsr stoptimer
X tst.w bottomin
X bne.s 398$
X move.w #1,bottomin
X clr.w ibufferlen
X clr.w curpos
X bsr UpdateIArea
X398$ move.l #usetxt,d0
X bsr putnam
X clr.l lastprinted
X bsr blastout
X bra.s 420$
X
X399$ cmp.b #'C',1(a2) ;cursor right
X bne.s 400$
X cmp.w ibufferlen(PC),d4
X bge.s 420$
X addq #1,d4
X421$ move.w d4,curpos
X420$ bra 100$
X
X400$ cmp.b #'D',1(a2) ;cursor left
X bne.s 401$
X subq #1,d4
X bpl.s 421$
X bra.s 420$
X
X401$ cmp.b #' ',1(a2)
X bne.s 402$
X
X cmp.b #'@',2(a2) ;shift right
X bne.s 403$
X
X404$ cmp.w ibufferlen(PC),d4
X bge.s 421$
X addq #1,d4
X cmp.b #' ',0(a1,d4)
X bne.s 404$
X405$ cmp.w ibufferlen(PC),d4
X bge.s 421$
X addq #1,d4
X cmp.b #' ',0(a1,d4)
X beq.s 405$
X bra.s 421$
X
X403$ cmp.b #'A',2(a2) ;shift left
X bne.s 420$
X406$ tst.w d4
X beq.s 421$
X subq #1,d4
X cmp.b #' ',0(a1,d4)
X beq.s 406$
X407$ tst.w d4
X beq.s 421$
X subq #1,d4
X cmp.b #' ',0(a1,d4)
X bne.s 407$
X addq #1,d4
X bra.s 421$
X
X402$ cmp.b #'A',1(a2) ;cursor up
X bne.s 408$
X tst.w bottomin
X bne.s 480$
X tst.w curpos
X bne.s 480$
X
X clr.w curpos
X clr.w ibufferlen
X bsr UpdateIArea
X bsr clrcursor
X move.w edline(PC),d3
X ext.l d3
X tst.w d3
X beq.s 481$
X subq #1,d3
X cmp.l firstline(PC),d3
X bge.s 481$
X move.l d3,-(a7)
X subq.l #1,firstline
X bsr blastout
X move.l (a7)+,d3
X481$ move.w d3,edline
X bsr getcurpos
X bsr putcursor
X bra intuiend
X480$ move.l history(PC),a0
X tst.l 0(a0)
X beq.s 423$
X move.l curhist(PC),a1
X cmp.l a0,a1
X beq.s 409$
X move.l 4(a1),d0
X move.l d0,curhist
X409$ move.l a1,gothline
X bsr copyhistory
X423$ bra 100$
X
X408$ cmp.b #'B',1(a2) ;cursor down
X bne 410$
X tst.w bottomin
X bne.s 414$
X tst.w curpos
X bne.s 414$
X
X clr.w curpos
X clr.w ibufferlen
X bsr UpdateIArea
X bsr clrcursor
X move.w edline(PC),d3
X ext.l d3
X move.l numlines(PC),d4
X subq #1,d4
X cmp.l d4,d3
X beq.s 490$
X move.l firstline(PC),d2
X add.w rows(PC),d2
X subq #1,d2
X addq #1,d3
X cmp.w d2,d3
X ble.s 490$
X move.l d3,-(a7)
X addq.l #1,firstline
X bsr blastout
X move.l (a7)+,d3
X490$ bra 481$
X414$ move.l curhist(PC),d0
X beq.s 423$
X move.l d0,a1
X move.l 0(a1),a1
X tst.l 0(a1)
X bne.s 411$
X clr.l gothline
X clr.w curpos
X clr.w ibufferlen
X bra 423$
X411$ move.l a1,curhist
X bra 409$
X
X410$ cmp.b #'T',1(a2) ;shift up
X bne.s 412$
X tst.w hnum
X beq 423$
X move.l history(PC),a1
X move.l a1,curhist
X bra 409$
X
X412$ cmp.b #'S',1(a2) ;shift down
X bne 423$
X tst.w hnum
X beq 423$
X move.l history+8,curhist
X bra.s 414$
X
X110$ moveq #0,d3
X101$ move.w curpos(PC),d4
X tst d0
X beq 100$
X cmp.b #13,0(a2,d3) ;return
X beq got_enter
X
X cmp.b #27,0(a2,d3) ;esc
X bne 799$
X tst.w getanswer
X bne 100$
X clr.b insmode
X clr.w ibufferlen
X move.w #200,curpos
X bsr UpdateIArea
X clr.w curpos
X tst.w bottomin
X bne.s 700$
X move.w #1,bottomin
X bsr getcurpos
X cmp.b #5,timerstate
X bne.s 765$
X bsr starttimer
X765$ bra 100$
X
X700$ move.b timerio+8,timerstate
X bsr stoptimer
X move.w edline(PC),d0
X move.l firstline(PC),d4
X cmp.w d4,d0
X bmi.s 701$
X move.w d4,d5
X add.w rows(PC),d5
X cmp.w d5,d0
X bmi.s 702$
X701$ move.w rows(PC),d0
X lsr.w #1,d0
X add.w d4,d0
X702$ move.l numlines(PC),d3
X subq #1,d3
X cmp.w d3,d0
X ble.s 703$
X move.w d3,d0
X703$ move.w d0,edline
X sub.w d4,d0
X lsl.w #3,d0
X add.w #18,d0
X move.w d0,cposy
X clr.w bottomin
X tst.w loffset
X beq.s 704$
X clr.w loffset
X bsr blastout
X704$ bra 100$
X
X799$ cmp.b #8,0(a2,d3) ;Backspace
X bne.s 114$
X tst.w d4
X beq 102$
X bsr delchar
X subq #1,d4
X move.w d4,curpos
X bra 102$
X
X114$ cmp.b #127,0(a2,d3) ;del
X bne.s 197$
X178$ cmp.w ibufferlen(PC),d4
X bge 102$
X addq #1,d4
X bsr delchar
X bra 102$
X
X197$ cmp.b #3,0(a2,d3) ;ctrl c
X bne.s 104$
X move.b #1,cbreak
X
X104$ tst.b addlines
X bne processnxtmsg
X cmp.b #$18,0(a2,d3) ;ctrl x
X bne.s 300$
X clr.w ibufferlen
X clr.w curpos
X bra 100$
X
X300$ cmp.b #$19,0(a2,d3) ;ctrl y
X bne.s 106$
X move.w curpos,ibufferlen
X bra 100$
X
X106$ move.w #$100,d5 ;NumPad
X and.w qualifier(PC),d5
X beq 105$
X move.l firstline(PC),d5
X
X cmp.b #'7',0(a2,d3) ;'Home'
X bne.s 200$
X moveq #0,d5
X199$ move.l d5,firstline
X bsr blastout
X tst.w bottomin
X bne.s 196$
X move.w edline(PC),d0
X move.l firstline(PC),d1
X cmp.w d1,d0
X bmi.s 190$
X add.w rows(PC),d1
X cmp.w d1,d0
X bmi.s 192$
X190$ clr.w curpos
X clr.w ibufferlen
X move.w rows(PC),d0
X lsr.w #1,d0
X ext.l d0
X add.l firstline(PC),d0
X cmp.l numlines(PC),d0
X bmi.s 191$
X move.l numlines(PC),d0
X subq #1,d0
X191$ move.w d0,edline
X192$ bsr getcurpos
X bsr UpdateIArea
X196$ bra 100$
X
X200$ cmp.b #'8',0(a2,d3) ;'up arrow'
X bne.s 201$
X tst d5
X beq 100$
X subq #1,d5
X bra.s 199$
X
X201$ cmp.b #'9',0(a2,d3) ;'PgUp'
X bne.s 203$
X sub.w rows(PC),d5
X bpl.s 199$
X moveq #0,d5
X bra.s 199$
X
X203$ cmp.b #'1',0(a2,d3) ;'End'
X bne.s 205$
X222$ move.l numlines(PC),d5
X sub.w rows(PC),d5
X bpl 199$
X moveq #0,d5
X204$ bra 199$
X
X205$ cmp.b #'2',0(a2,d3) ;'down arrow'
X bne.s 206$
X move.l d5,d2
X add.w rows(PC),d2
X cmp.l numlines(PC),d2
X bge 100$
X addq #1,d5
X bra 199$
X
X206$ cmp.b #'3',0(a2,d3) ;'PgDn'
X bne.s 500$
X add.w rows(PC),d5
X move.l d5,d2
X add.w rows(PC),d2
X cmp.l numlines(PC),d2
X bge.s 222$
X bra 199$
X
X500$ cmp.b #'4',0(a2,d3) ;left arrow
X bne.s 501$
X tst.w bottomin
X beq 102$
X move.w loffset(PC),d2
X sub.w colms(PC),d2
X bpl.s 502$
X moveq #0,d2
X502$ move.w d2,loffset
X bsr blastout
X bra 100$
X
X501$ cmp.b #'6',0(a2,d3) ;right arrow
X bne.s 170$
X tst.w bottomin
X beq 102$
X move.w loffset(PC),d2
X add.w colms(PC),d2
X bra.s 502$
X
X170$ cmp.b #'0',0(a2,d3) ;Ins
X bne.s 177$
X eor.b #1,insmode
X bra.s 102$
X
X177$ cmp.b #'.',0(a2,d3) ;Del
X beq 178$
X
X105$ tst.w bottomin
X bne.s 777$
X tst.w curpos
X bne.s 777$
X movem.l d0-d1,-(a7)
X move.w edline(PC),d0
X bsr findline
X movem.l (a7)+,d0-d1
X tst.l 8(a5)
X beq intuiend
X777$ move.w curpos(PC),d5
X ext.l d5
X moveq #79,d2
X cmp.w d2,d5
X bge 102$
X tst.b insmode
X beq.s 172$
X cmp.w ibufferlen(PC),d5
X bmi.s 171$
X bra.s 173$
X172$ sub d5,d2
X lea 80(a1),a4
X lea 79(a1),a3
X103$ move.b -(a3),-(a4)
X dbf d2,103$
X173$ addq.w #1,ibufferlen
X171$ move.b 0(a2,d3),0(a1,d5)
X addq.w #1,curpos
X102$ subq #1,d0
X addq #1,d3
X bra 101$
X
X100$ bsr UpdateIArea
X bra intuiend
X
Xgot_enter bsr stoptimer
X bsr puthist
X clr.b insmode
X lea dummy,a1
X lea inputbuffer,a2
X move.w ibufferlen(PC),d2
X beq.s 2$
X tst.w bottomin
X bne.s 5$
X movem.l a1-a2,-(a7)
X move.w edline(PC),d0
X bsr findline
X move.l 8(a5),d0
X bsr gthex
X lea hexarea(PC),a0
X lea 0(a2,d2),a1
X move.b #' ',(a1)+
X move.b #'$',(a1)+
X moveq #8,d0
X CALL CopyMem,_SysBase(PC)
X move.w ibufferlen(PC),d2
X add.w #10,d2
X move.w d2,ibufferlen
X movem.l (a7)+,a1-a2
X5$ subq #1,d2
X1$ move.b (a2)+,(a1)+
X dbf d2,1$
X2$ move.b #10,(a1)+
X move.w ibufferlen(PC),d0
X ext.l d0
X addq #1,d0
X move.l d0,-(a7)
X clr.w ibufferlen
X tst.w bottomin
X bne.s 4$
X move.w #100,curpos
X bsr UpdateIArea
X4$ clr.w curpos
X move.w #1,bottomin
X bsr getcurpos
X bsr UpdateIArea
X move.l (a7)+,d0
X move.w d0,repeatlen
X clr.w repeat
X clr.b printed
X tst.w getanswer
X beq.s 6$
X rts
X6$ bsr cli
X tst.b printed
X bne.s 3$
X bsr starttimer
X3$ bra intuiend
X
Xnotarawkey
X
Xintuiend bsr.s replyintui
X bra nextimsg
Xprocessnxtmsg
X tst.b addlines
X beq.s 1$
X rts
X1$ bra processmsgs
X
Xreplyintui move.l intuimsg(PC),d0
X beq.s 1$
X move.l d0,a1
X CALL ReplyMsg,_SysBase
X1$ clr.l intuimsg
X rts
X
X;put an input line into the history buffer
Xputhist move.w ibufferlen(PC),d5
X move.l d5,d0
X cmp.w minnumchars(PC),d0
X bcs 1$
X
X move.l gothline(PC),d1
X beq.s 5$
X move.l d1,a2
X cmp.w 8(a2),d5
X bne.s 5$
X lea 10(a2),a2
X lea inputbuffer,a1
X subq #1,d0
X6$ cmp.b (a2)+,(a1)+
X bne.s 5$
X dbf d0,6$
X move.l gothline,curhist
X bra.s 1$
X
X5$ move.w d5,d0
X ext.l d0
X add #10,d0
X move.l #$10000,d1 ;MEMF_CLEAR
X CALL AllocMem,_SysBase(PC)
X tst.l d0
X beq.s 1$
X move.l d0,a0
X move.w d5,8(a0)
X lea 10(a0),a2
X subq #1,d5
X lea inputbuffer,a1
X2$ move.b (a1)+,(a2)+
X dbf d5,2$
X move.w hnum(PC),d5
X cmp.w maxhlines(PC),d5
X bmi.s 3$
X bsr remhistline
X bra.s 4$
X3$ addq #1,d5
X move.w d5,hnum
X4$ move.l d0,a1
X move.l d0,curhist
X lea history(PC),a0
X CALL AddTail,_SysBase(PC)
X1$ clr.l gothline
X rts
X
X;copy a history line into the input buffer
Xcopyhistory lea inputbuffer,a0
X move.w 8(a1),d3
X ext.l d3
X move.w d3,curpos
X move.w d3,ibufferlen
X subq #1,d3
X lea 10(a1),a1
X1$ move.b (a1)+,(a0)+
X dbf d3,1$
X rts
X;remove one line from the history buffer
X;pointer to the line in A1, returns pointer to the next line in d1
Xremhistline move.l d0,-(a7)
X lea history(PC),a0
X move.l 0(a0),a5
X tst.l 0(a5)
X beq.s 1$
X CALL RemHead,_SysBase(PC)
X move.l a5,a1
X move.w 8(a1),d0
X add #10,d0
X ext.l d0
X CALL FreeMem,_SysBase(PC)
X1$ move.l (a7)+,d0
X rts
X
X;kill all history lines
Xkillhistory bsr remhistline
X move.l history(PC),a0
X tst.l 0(a0)
X bne.s killhistory
X2$ clr.w hnum
X clr.l curhist
X rts
X;delete one char from the input line
Xdelchar lea inputbuffer,a3
X lea 0(a3,d4.w),a3
X lea -1(a3),a4
X move d4,d5
X1$ cmp.w #78,d5
X bge.s 2$
X move.b (a3)+,(a4)+
X addq #1,d5
X bra.s 1$
X2$ subq.w #1,ibufferlen
X rts
X
Xtestsig move.l tasksigs(PC),d0
X btst d1,d0
X rts
X
X;get the position of the input area
Xiareapos move.l wnptr(PC),a0
X move.w 10(a0),d0
X subq #4,d0
X move.w d0,ipos
X rts
X
X;Update the current position of the input line
Xgetcurpos tst.w bottomin
X beq.s 1$
X move.w ipos,cposy
X rts
X1$ move.w edline(PC),d3
X sub.l firstline(PC),d3
X lsl #3,d3
X add.w #18,d3
X move.w d3,cposy
X rts
X;refresh the input area
XUpdateIArea move.l rastport(PC),a1
X move.l #1,d0
X CALL SetDrMd,gfxbase(PC)
X moveq #6,d0
X move.w cposy(PC),d1
X CALL Move,gfxbase(PC)
X lea inputbuffer,a0
X move.w ibufferlen(PC),d0
X ext.l d0
X move.w colms(PC),d1
X sub.w bottomin(PC),d1
X cmp.w d1,d0
X bmi.s 1$
X move.w d1,d0
X1$ move.w d0,d2
X CALL Text,gfxbase(PC)
X
X tst.w bottomin
X bne.s 3$
X move.w edline(PC),d0
X bsr findline
X move.w 12(a5),d3
X sub.w d2,d3
X bmi.s 3$
X move.w colms(PC),d1
X sub.w d2,d1
X bmi.s 2$
X cmp.w d1,d3
X ble.s 4$
X move.w d1,d3
X4$ move.w d3,d0
X lea 14(a5,d2.w),a0
X move.l rastport(PC),a1
X CALL Text,gfxbase(PC)
X add.w ibufferlen(PC),d3
X move.w d3,d2
X
X3$ move.w colms(PC),d0
X sub.w bottomin(PC),d0
X move.l blanks(PC),a0
X ext.l d0
X sub.w d2,d0
X bmi.s 2$
X lea 0(a0,d2.w),a0
X move.l rastport(PC),a1
X CALL Text,gfxbase(PC)
X2$ bsr putcursor
X rts
X
Xclrcursor moveq #1,d7
X bra.s ptc1
Xputcursor moveq #6,d7
Xptc1 move.w curpos(PC),d0
X move.w colms(PC),d1
X subq #1,d1
X sub.w bottomin(PC),d1
X cmp.w d0,d1
X bmi.s 1$
X move.l rastport(PC),a1
X move.l d7,d0
X CALL SetDrMd,gfxbase(PC)
X move.w cposy(PC),d1
X move.w curpos(PC),d0
X lsl.w #3,d0
X addq #6,d0
X CALL Move,gfxbase(PC)
X lea oneblank(PC),a0
X moveq #1,d0
X CALL Text,gfxbase(PC)
X1$ rts
X;rebuild the window from scratch
Xsetupscreen move.l rastport(PC),a1
X moveq #0,d0
X CALL SetRast,gfxbase(PC)
X move.l wnptr,a0
X CALL RefreshWindowFrame,intuibase(PC)
X bsr getwindowsize
X tst.w bottomin
X bne.s 1$
X move.w edline(PC),d0
X move.l firstline(PC),d1
X move.w rows(PC),d2
X move.w d2,d4
X move.w numlines(PC),d3
X add.w d1,d2
X cmp.w d2,d0
X bmi.s 2$
X lsr.w #1,d4
X sub.w d4,d0
X ext.l d0
X move.l d0,firstline
X2$ bsr tstfirstlin
X1$ bsr getcurpos
X bsr putiline
X bsr blastout
X bsr UpdateIArea
X move.w rows,currenty
X rts
X
Xputiline move.l rastport(PC),a1
X moveq #1,d0
X CALL SetAPen,gfxbase(PC)
X move.l rastport(PC),a1
X moveq #1,d0
X CALL SetDrMd,gfxbase(PC)
X move.l wnptr(PC),a5
X move.w 10(a5),d1
X sub.w #12,d1
X moveq #0,d0
X CALL Move,gfxbase(PC)
X move.w 8(a5),d0
X move.w d1,-(a7)
X CALL Draw,gfxbase(PC)
X move.w (a7)+,d1
X tst.b ownscreen
X bne.s 1$
X move.w 8(a5),d0
X addq #1,d1
X CALL Move,gfxbase(PC)
X sub.w #16,d0
X move.w d1,-(a7)
X CALL Draw,gfxbase(PC)
X move.w (a7)+,d1
X move.w 8(a5),d0
X addq #1,d1
X CALL Move,gfxbase(PC)
X sub.w #16,d0
X CALL Draw,gfxbase(PC)
X1$ rts
X
Xgetwindowsize
X bsr freeblank
X move.l wnptr(PC),a0
X move.w 10(a0),d0
X sub.w #26,d0
X lsr.w #3,d0
X move.w d0,rows
X move.w 8(a0),d0
X sub.w #12,d0
X lsr.w #3,d0
X move.w d0,colms
X ext.l d0
X moveq #0,d1
X move.l d0,d6
X CALL AllocMem,_SysBase(PC)
X move.l d0,blanks
X move.l d0,a0
X subq #1,d6
X1$ move.b #' ',(a0)+
X dbf d6,1$
X bsr iareapos
X rts
X
Xreadline move.b #'n',inputbuffer
X tst.b fromfile
X bne.s 1$
X move.l #31000,firstline
X bsr blastout
X move.w #1,getanswer
X bsr replyintui
X5$ bsr processmsgs
X move.w d0,d5
X bsr replyintui
X subq #1,d5
X beq.s 5$
X ori.b #$20,inputbuffer
X clr.w getanswer
X bsr RestoreOutput
X1$ rts
X
XResumeOutput
X move.l outchain(PC),d0
X move.l d0,a1
X beq.s 2$
X move.l numlines,oldnumlines
X move.l firstline,oldfirstline
X4$ tst.l 0(a1)
X beq.s 3$
X move.l 0(a1),a1
X bra.s 4$
X3$ move.l a1,lastprinted
X2$ move.l a1,oldpageend
X rts
X
XRestoreOutput
X move.l oldpageend(PC),d3
X beq.s 1$
X move.l oldnumlines(PC),numlines
X move.l oldfirstline(PC),firstline
X move.l oldlastprinted(PC),lastprinted
X move.l d3,a1
X move.l 0(a1),a1
X bsr killlines
X move.l d3,a1
X clr.l 0(a1)
X bsr blastout
X1$ rts
X
Xaddline movem.l d0-d6/a0-a3,-(a7)
X move.l rastport(PC),a1
X moveq #1,d0
X CALL SetAPen,gfxbase(PC)
X move.l rastport(PC),a1
X moveq #1,d0
X CALL SetDrMd,gfxbase(PC)
X move.w currenty(PC),d6
X cmp.w rows(PC),d6
X bmi.s 1$
X bsr cls
X1$ move.l lastprinted(PC),a0
X move.w colms(PC),d5
X move.w 12(a0),d3
X lea 14(a0),a0
X move.w currenty(PC),d6
X move d6,d7
X lsl #3,d6
X add.w #18,d6
X moveq #0,d4
X bsr blastline
X addq.w #1,currenty
X move.l #31000,firstline
X movem.l (a7)+,d0-d6/a0-a3
X rts
X
Xcls movem.l d0-d6/a0-a3,-(a7)
X move.l rastport(PC),a1
X moveq #1,d0
X CALL SetAPen,gfxbase(PC)
X move.l rastport(PC),a1
X moveq #1,d0
X CALL SetDrMd,gfxbase(PC)
X move.w colms(PC),d5
X clr.w d2
X1$ move.w d2,d6
X move d5,d7
X lsl #3,d6
X add.w #18,d6
X moveq #0,d3
X move.l blanks(PC),a0
X bsr blastline
X addq #1,d2
X cmp.w rows(PC),d2
X bmi.s 1$
X clr.w currenty
X movem.l (a7)+,d0-d6/a0-a3
X rts
X
Xcreatescreen moveq #1,d1
X moveq #80,d0
X lea buffer,a0
X sub.l a1,a1
X CALL GetScreenData,intuibase(PC)
X move.w buffer+76,nsviewmode
X move.l buffer+12,nssize
X lea newscreen(PC),a0
X CALL OpenScreen,intuibase(PC)
X move.l d0,screenptr
X move.l d0,nwscreen
X move.w #$f,nwtype
X beq.s setupwindow
X tst.l wnptr
X beq.s 1$
X move.l wnptr(PC),a0
X move.l 4(a0),window_l
X move.l 8(a0),window_w
X CALL CloseWindow,intuibase(PC)
X clr.l intuimsg
X clr.l wnptr
X1$ clr.l newwindow
X move.l buffer+12,newwindow+4
X move.l wnscrflags(PC),nwflgs
X move.l wnscrflags+4(PC),nwflgs+4
X move.b #1,ownscreen
X
Xsetupwindow tst.b ownscreen
X bne.s 3$
X move.l window_l(PC),newwindow
X move.l window_w(PC),newwindow+4
X move.w #1,nwtype
X move.l wnnormflgs(PC),nwflgs
X move.l wnnormflgs+4(PC),nwflgs+4
X3$ lea newwindow(PC),a0
X CALL OpenWindow,intuibase(PC)
X move.l d0,wnptr
X beq exit
X move.l d0,a0
X move.l 50(a0),rastport ;wn->RPort
X move.l 86(a0),a1 ;wn->UserPort
X move.b 15(a1),d1 ;MsgPort->SigBit
X ext.w d1
X move.w d1,intuisig
X
X tst.b iconifyon
X beq.s 1$
X tst.b ownscreen
X bne.s 1$
X lea iconifgad,a1
X moveq #0,d0
X CALL AddGadget,intuibase(PC)
X move.l wnptr(PC),a0
X CALL RefreshWindowFrame,intuibase(PC)
X
X1$ lea tattr(PC),a0
X CALL OpenFont,gfxbase(PC)
X tst.l d0
X beq.s 2$
X move.l d0,a0
X move.l rastport(PC),a1
X CALL SetFont,gfxbase(PC)
X2$ bsr getwindowsize
X bsr getcurpos
X
X bsr putiline
X bsr UpdateIArea
X bsr starttimer
X bsr showwhat
X rts
X
Xusescreen tst.b fromfile
X bne.s 1$
X tst.b ownscreen
X bne.s 1$
X bsr createscreen
X1$ move.b #1,ownscreen
X rts
X
Xusewindow tst.b fromfile
X beq.s 1$
X clr.b ownscreen
X rts
X1$ tst.b ownscreen
X beq.s 2$
X move.l wnptr(PC),d0
X beq.s 3$
X move.l d0,a0
X CALL CloseWindow,intuibase(PC)
X clr.l wnptr
X clr.l intuimsg
X3$ move.l screenptr(PC),d0
X beq.s 4$
X move.l d0,a0
X CALL CloseScreen,intuibase(PC)
X clr.l screenptr
X clr.b ownscreen
X4$ bra setupwindow
X2$ rts
X
Xdchange lea dchead(PC),a0
X bsr puthead
X lea tdd(PC),a1
X move.l _SysBase(PC),a0
X lea 350(a0),a0
X CALL FindName,_SysBase(PC)
X tst.l d0
X beq R_T_S
X move.l d0,a2
X lea 32(a2),a2
X moveq #0,d5
X2$ lea 4(a2),a2
X move.l 0(a2),d0
X beq 3$
X move.l d0,a0
X lea $18e(a0),a0
X CALL Disable,_SysBase(PC)
X5$ tst.l 0(a0)
X beq.s 6$
X move.l 0(a0),a0
X bra.s 5$
X6$ lea -4(a0),a5
X lea buffer+100,a3
X9$ move.l 0(a5),a5
X tst.l 0(a5)
X beq.s 11$
X move.l a5,(a3)+
X bne.s 9$
X11$ clr.l (a3)+
X CALL Enable,_SysBase(PC)
X lea buffer+100,a3
X7$ move.l (a3)+,d0
X beq.s 3$
X move.l d0,a5
X cmp.w #20,28(a5)
X bne.s 7$
X move.l 40(a5),a4
X move.l a4,d0
X move.l d0,node
X bsr hexan
X move.l a4,d0
X beq.s 10$
X move.l 14(a4),d0
X bsr hexan
X move.l 18(a4),d0
X bsr hexan
X10$ move.l d5,d3
X or.b #48,d3
X move.b d3,tddrives+2
X move.l #tddrives,d0
X bsr putstr
X move.l 14(a5),d0
X beq.s 8$
X move.l d0,a0
X move.l 16(a0),d0
X beq.s 8$
X move.l d0,a0
X move.l 10(a0),d0
X8$ bsr putnam
X bra.s 7$
X3$ addq #1,d5
X cmp.w #4,d5
X bmi 2$
XR_T_S rts
X
Xdosbase dc.l 0
Xintuibase dc.l 0
Xgfxbase dc.l 0
Xcondev dc.l 0
Xparmtxt dc.l 0
Xfileptr dc.l 0
Xinfile dc.l 0
Xptr dc.l 0
Xoldidl dc.l 0
Xolddisp dc.l 0
Xmysignal dc.l 0
Xauxsig dc.l 0
Xtrapsignal dc.l 0
Xiostatus dc.l -1
Xdevstatus dc.l -1
Xtasksigs dc.l 0
Xcancelbit dc.l 0
Xcancelbnum dc.l 0
X_SysBase dc.l 0
XInputMsg dc.l 0
XInRequest dc.l 0
Xstartmess dc.l 0
Xsavedat dc.l 0
Xwnptr dc.l 0
Xaliaslist dc.l 0
Xscreenptr dc.l 0
Xintuimsg dc.l 0
Xmytask dc.l 0
Xwbmsg dc.l 0
Xpointer dc.l 0
Xreplyport dc.l 0
Xtimerport dc.l 0
Xfinfoptr dc.l 0
Xmyseg dc.l 0
Xdispatches dc.l 0
Xmaxdisp dc.l 0
Xdeltadisp dc.l 0
Xwbaddr dc.l 0
Xnode dc.l 0
Xremembr dc.l 0
Xremembr2 dc.l 0
SHAR_EOF
echo "End of archive 2 (of 3)"
# if you want to concatenate archives, remove anything after this line
exit